#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>

int main() {
    int fd[2]; // 定义一个整型数组fd，用于存储管道的文件描述符
    pid_t pid; // 定义一个进程ID变量pid
    char buf[20]; // 定义一个字符数组buf，用于存储读取的数据
    char *msg = "从父进程问好"; // 定义一个字符串变量msg，用于存储要写入管道的数据


    // 创建一个管道，fd[0]用于读，fd[1]用于写
    if (pipe(fd) == -1) {
        perror("pipe"); // 如果管道创建失败，打印错误信息
        exit(1); // 退出程序
    }


    // 创建一个子进程
    pid = fork();
    if (pid == -1) {
        perror("fork"); // 如果创建子进程失败，打印错误信息
        exit(1); // 退出程序
    }

    if (pid == 0) { // 子进程
        printf("子进程开始运行\n");
        // sleep(1); // 等待1秒，确保子进程先运行
        read(fd[0], buf, sizeof(buf)); // 从管道的读端读取数据到buf
        printf("子进程接收到: %s\n", buf); // 打印接收到的数据

        close(fd[0]); // 关闭管道的读端
        close(fd[1]); // 关闭管道的写端
    } else { // 父进程
        printf("父进程开始运行\n");
        // sleep(3); // 等待2秒，确保父进程先运行
        // close(fd[0]); // 关闭管道的读端
        // 向管道的写端写入数据
        write(fd[1], msg, strlen(msg));
        printf("父进程发送数据: %s\n", msg); // 打印发送的数据

        close(fd[1]); // 关闭管道的写端
        printf("父进程等待子进程结束\n");
        sleep(3); // 等待子进程结束

    }

    return 0; // 程序正常结束
}
